socket函数
1int socket(int domain, int type, int protocol)- domain:主机采用的通讯协议族(AF_UNIX和AF_INET),AF_UNIX只能够用于单一的Unix系统进程间进行通信,而AF_INET是针对Internet的。因而允许在远程主机之间进行通信。
- type:采用的通信协议(SOCK_STREAM、SOCK_DGRAM等),SOCK_STREAM表明我们用的是TCP协议,而SOCK_DGRAM表示使用的是UDP协议。
- protocol:由于指定了type,所以protocol的值一般为0
socket()函数成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况。
bind函数
1int bind(int sockfd, struct sockaddr* my_addr, int addrlen);sockfd:socket函数返回的文件描述符
addrlen:是sockaddr结构的长度
my_addr:一个指向sockaddr的指针,
struct sockaddr
的定义如下:1234struct sockaddr {unsigned short as_family;char sa_data[14];};不过由于系统的兼容性,一般不用这个头文件,而使用另外一个结构(
struct sockaddr_in
)来代替,其定义如下:123456struct sockaddr_in {unsigned short sin_family;unsigned short int sin_port;struct in_addr sin_addr;unsigned char sin_zero[8];};我们主要使用Internet,所以sin_family一般为AF_INET,sin_addr设置为INADDR_ANY表示可以和任何的主机通信,sin_port是监听的端口号,sin_zero[8]是用来填充的。
bind函数的作用就是将本地的端口和socket函数返回的文件描述符捆绑在一起,成功时返回0。
linten函数
1int linten(int sockfd, int backlog);- sockfd:是bind后的文件描述符
- backlog:设置请求队列的最大长度
listen函数的作用就是bind的文件描述符转为监听套接字。
accept函数
1int accept(int sockfd, struct sockaddr* addr, int* addrlen);- sockfd:是listen后的文件描述符
- addr、addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了,bind、listen和accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接,accept成功时返回最后的服务器端的文件描述符,这个时候服务器端就可以向该描述符写信息了。
connect函数
1int connect(int sockfd, struct sockaddr* serv_addr, int addrlen);- sockfd:socket返回的文件描述符
- serv_addr:存储了服务器端的连接信息,其中sin_addr是服务端的地址
- addr_len:serv_addr的长度
connect函数是客户端用来同服务端连接的,成功时返回0。
setsockopt函数
1int setsockopt(socket s, int level, int optname, const char* optval, int optlen);- s:指向一个打开的套接字描述符
- level:
- SOL_SOCKET:基本套接口
- IPPROTO_IP:IPV4套接口
- IPPROTO_IPV6:IPV6套接口
- IPPROTO_TCP:TCP套接口
- optname:选项名称
- optval:指针,指向存放选项值的缓冲区
- optlen:optval缓冲区长度
inet_ntop函数
1const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);这个函数转换网络二进制结构到ASCII类型的地址。
- af:地址簇,其取值可以为AF_INET、AF_INET6
- src:来源地址
- dst:接收转换后的数据
- cnt:缓冲区dst的大小
ntohs函数
将一个16位数由网络字节序转换为主机字节顺序。